function [myTable] = reportSubmodelResults(paramNames, params_hat, params_ses, modelFits, varargin)
	
	if nargin >= 5
		truth = varargin{1};
	else
		truth = {};
	end
	if nargin >= 6
		cleanupOutput = varargin{2};
	else
		cleanupOutput = false;
	end
	
	vals     = params_hat;
	vals_ses = params_ses;
	rowNames = paramNames;
	if ~isempty(modelFits)
		vals     = [vals; modelFits.LL; modelFits.AIC; modelFits.BIC; modelFits.MAE; modelFits.MSE; modelFits.RMSE];
		vals_ses = [vals_ses; -1; -1; -1; -1; -1; -1];
		rowNames = [rowNames; {'LL'; 'AIC'; 'BIC'; 'MAE'; 'MSE'; 'RMSE'}];
	end
	if exist('truth') && ~isempty(truth)
		truth_vals = [truth.params; -1; -1; -1; -1; -1; -1];
		myTable = table(truth_vals, vals, vals_ses);
		myTable.Properties.VariableNames = {'Truth', 'Estimates', 'Std. Error'};
		myTable.Properties.RowNames = rowNames;
	else
		myTable = table(vals, vals_ses);
		myTable.Properties.VariableNames = {'Estimates', 'Std. Error'};
		myTable.Properties.RowNames = rowNames;
	end
	
	if cleanupOutput
		% Get mapping to "clean" row names
		rowNamesMapping = getRowNamesMapping();
		
		% Combine estimate and standard error into a string
		estimates = table2array(myTable(:,end-1));
		std_errors = table2array(myTable(:,end));
		NumRows = length(estimates);
		estimateStrings = cell(NumRows,1);
		for ii = 1:NumRows
			rowNames{ii} = strrep(rowNames{ii}, 'Beta ', '');
			rowNames{ii} = strrep(rowNames{ii}, ' on NewConsumers', '');
			rowNames{ii} = strrep(rowNames{ii}, ' on NewProviders', '');
			rowNames{ii} = strrep(rowNames{ii}, ' on ProviderExits', '');
			rowNames{ii} = strrep(rowNames{ii}, ' on NewPairs', '');
			rowNames{ii} = strrep(rowNames{ii}, ' on AcctCreationInactives', '');
			rowNames{ii} = strrep(rowNames{ii}, ' on AcctCreationConsumers', '');
			rowNames{ii} = strrep(rowNames{ii}, ' on AcctCreationProviders', '');
			
			if strcmp(rowNames{ii}, 'origdest(Weight_TouristTrip x 1e1)')
				estimates(ii)  = 10*estimates(ii);
				std_errors(ii) = 10*std_errors(ii);
			end
			if strcmp(rowNames{ii}, 'torig(TAVG x 1e-1)')
				estimates(ii)  = 0.1*estimates(ii);
				std_errors(ii) = 0.1*std_errors(ii);
			end
			if strcmp(rowNames{ii}, 'tdest(TAVG x 1e-1)')
				estimates(ii)  = 0.1*estimates(ii);
				std_errors(ii) = 0.1*std_errors(ii);
			end
			if strcmp(rowNames{ii}, 'orig(UnemploymentRate x 1e1)')
				estimates(ii)  = 10*estimates(ii);
				std_errors(ii) = 10*std_errors(ii);
			end
			if strcmp(rowNames{ii}, 'orig(PctageVoix_JOLY x 1e1)')
				estimates(ii)  = 10*estimates(ii);
				std_errors(ii) = 10*std_errors(ii);
			end
			if strcmp(rowNames{ii}, 'dest(UnemploymentRate x 1e1)')
				estimates(ii)  = 10*estimates(ii);
				std_errors(ii) = 10*std_errors(ii);
			end
			if strcmp(rowNames{ii}, 'dest(PctageVoix_JOLY x 1e1)')
				estimates(ii)  = 10*estimates(ii);
				std_errors(ii) = 10*std_errors(ii);
			end
			
			if ~isempty(truth); error('Need to also update values for truth!'); end;	
			
			[flag,idx] = ismember(rowNames{ii}, rowNamesMapping(:,1));
			if flag
				rowNames{ii} = rowNamesMapping{idx,2};
			else
				nameLength = length(rowNames{ii});
				if ~strcmp(rowNames{ii}, 'ttIntercept') && ...
				~(nameLength >= 15 && strcmp(rowNames{ii}(1:15), 'ttyearMonth_is_')) && ...
				~(nameLength >= 19 && strcmp(rowNames{ii}(1:19), 'origoldRegionId_is_')) && ...
				~(nameLength >= 19 && strcmp(rowNames{ii}(1:19), 'destoldRegionId_is_'))
					warning(sprintf('Could not find row name in mapping: %s', rowNames{ii}));
				end
			end
			
			if std_errors(ii) < 0
				estimateStrings{ii} = sprintf('%.2f', estimates(ii));
			else
				if abs(estimates(ii))/std_errors(ii) > 1.96 
					estimateStrings{ii} = sprintf('%.2f (%.2f)*', estimates(ii), std_errors(ii));
				else
					estimateStrings{ii} = sprintf('%.2f (%.2f)', estimates(ii), std_errors(ii));
				end
			end
			
		end
		
		M2 = cell2table(estimateStrings);
		M2.Properties.RowNames = rowNames;
		
		% Reorder the rows
		[flag, idx] = ismember(rowNames, rowNamesMapping(:,2));
		absents = find(~flag);
		presents = find(flag);
		idx = idx(flag);
		[~,idx2] = sort(idx);
		presents = presents(idx2);
		M2_absent = M2(absents,:);
		M2_present = M2(presents,:);
		M2 = [M2_present; M2_absent];
		
		myTable = M2;
	end
end
